/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controlador;

import AdministradorDeVotacion.AdministradorDeDatos;
import InterfazHardware.HabilitadorTarjeta;
import InterfazHardware.InterfazHabilitacion;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import maquinavotar.InterfazDeUsuario;
import maquinavotar.common.Candidate;

/**
 *
 * @author Maximiliano
 */
public class GestorDeEventos {
    private InterfazDeUsuario vista;
    private InterfazHabilitacion habilitador;
    private AdministradorDeDatos repositorio;
    private List<Candidate> cands;

    public GestorDeEventos(InterfazDeUsuario v, List<Candidate> candidatos) {
        // asignacion de la vista correspondiente a la interfaz de usuario
        this.vista = v;
        // instanciación del habilitador de tarjeta electrónica
        habilitador = new HabilitadorTarjeta();
        repositorio = new AdministradorDeDatos();

        // agrega los listeners correspondientes a los componentes
        v.addListenerBotonPorCateg(new ControladorPorCategoria());
        v.addListenerBotonListaComp(new ControladorPorListaComp());
        v.addListenerBotonEnBlanco(new ControladorEnBlanco());
        v.addListenerIngresarTarjetaVotante(new ControladorIngresarTarjetaVotante());
        v.addListenerIngresarTarjetaAdministrador(new ControladorIngresarTarjetaAdm());
        v.addListenerConfirmarVotoEnBlanco(new ControladorConfirmarVotoEnBlanco());
        v.addListenerVolverAModoVot(new ControladorVolverAModoVot());
        v.addListenerCerrarPrograma(new ControladorCerrarPrograma());
        v.addMouseMotionListenerCerrarPrograma(new ControladorMotionCerrarPrograma());
        v.addMouseListenerCerrarPrograma(new ControladorMouseListenerCerrarPrograma());
        v.addMouseMotionListenerTarjetaVotante(new ControladorMotionTarjetaVotante());
        v.addMouseListenerTarjetaVotante(new ControladorMouseListenerTarjetaVotante());
        
        cands = candidatos;
    }

    public List<Candidate> getCandidatos() {
        return cands;
    }

    public class ControladorMouseListenerCerrarPrograma implements MouseListener {

        public void mouseClicked(MouseEvent e) {}

        public void mousePressed(MouseEvent e) {}

        public void mouseReleased(MouseEvent e) {}

        public void mouseEntered(MouseEvent e) {}

        public void mouseExited(MouseEvent e) {
             vista.agregarComentarioEnEtiqueta(" ");
        }

    }

    public class ControladorMotionTarjetaVotante implements MouseMotionListener {
        public void mouseMoved(MouseEvent e) {
            vista.agregarComentarioEnEtiqueta("Permite el acceso a un usuario votante.");
        }

        public void mouseDragged(MouseEvent e) {}
    }

    public class ControladorMouseListenerTarjetaVotante implements MouseListener {

        public void mouseClicked(MouseEvent e) {}

        public void mousePressed(MouseEvent e) {}

        public void mouseReleased(MouseEvent e) {}

        public void mouseEntered(MouseEvent e) {}

        public void mouseExited(MouseEvent e) {
             vista.agregarComentarioEnEtiqueta(" ");
        }

    }

    public class ControladorMotionCerrarPrograma implements MouseMotionListener {
        public void mouseMoved(MouseEvent e) {
            vista.agregarComentarioEnEtiqueta("Cerrar el sistema de Voto Electrónico.");
        }

        public void mouseDragged(MouseEvent e) {}
    }

    public class ControladorCerrarPrograma implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            vista.cerrarAplicacion();
        }
    }

    
    public class ControladorVolverAModoVot implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            vista.mostrarPantallaModoVotacion();
        }
    }

    public class ControladorConfirmarVotoEnBlanco implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Su voto ha sido en blanco !!");
            vista.visualizarPantallaPrincipal();
        }
    }

    public class ControladorIngresarTarjetaVotante implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (!habilitador.habilitacionValida())
                JOptionPane.showMessageDialog(null, "Tarjeta inválida !!");
            else {
                // si molestan los JOptionPane los sacamos !!!!
                JOptionPane.showMessageDialog(null, "Tarjeta valida !!");
                vista.mostrarPantallaModoVotacion();
            }
        }
    }

    public class ControladorIngresarTarjetaAdm implements ActionListener {
        public void actionPerformed(ActionEvent e) {

        }
    }

    public class ControladorConfirmarVoto implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Obtener indice el arreglo correspondiente al botón seleccionado.
            String textoBoton = ((JButton) e.getSource()).getText();
            int posicion = Integer.valueOf(textoBoton.split(" ")[1]);
            // Obtener el candidato elejido.
            Candidate candidatoVotado = repositorio.getCandidatos()[posicion - 1];
            /*
             * se debe guardar el voto. Se debe llamar al modulo "Almacenador en tarjeta"
             */
            vista.confirmarVoto(candidatoVotado.nombre);
        }
    }

    public class ControladorPorCategoria implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Muestra por pantalla la lista de candidatos aleatorizada y obtiene los correspondientes
            // botones.
            JButton[] botonesVotar = vista.MostrarPantallaPorCategoria(repositorio.getCandidatos());

            for (int i = 0; i < botonesVotar.length; i++)
                vista.addListenerBotonVotar(new ControladorConfirmarVoto(), botonesVotar[i]);
        }
    }

    public class ControladorPorListaComp implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Votar Lista Completa  !!!!");
        }
    }

    public class ControladorEnBlanco implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //JOptionPane.showMessageDialog(null, "Votar En Blanco  !!!!");
            vista.mostrarPantallaVotoEnBlanco();
        }
    }
}
